#ifndef INC_FOC_H_
#define INC_FOC_H_

typedef enum {
    MODE_IDLE = 0,       // 空闲
    MODE_MEASUREMENT_CURRENT_DELAY = 1,
    MODE_MEASUREMENT_CURRENT_RUN = 2,
    MODE_MEASUREMENT_CURRENT_DONE = 3,
    MODE_MEASUREMENT_INDUCTANCE_DELAY = 4,
    MODE_MEASUREMENT_INDUCTANCE_RUN = 5,
    MODE_MEASUREMENT_INDUCTANCE_DONE = 6,

    MODE_VOLATGE = 14,    // angle,volatage根据控制输出电压
    MODE_CURRENT = 15,    // 根据iq_set、id_set控制输出电流
    MODE_SPEED = 16,
    MODE_POSITION = 17,
    MODE_POSITION_WITH_FIFO = 18,  // 梯形位置控制

    MODE_ERROR_VM_OVER_VOLTAGE = -1,     // 过压保护
    MODE_ERROR_VM_UNDER_VOLTAGE = -2,    // 欠压保护
    MODE_ERROR_VREF_OVER_VOLTAGE = -3,   // 过压保护
    MODE_ERROR_VREF_UNDER_VOLTAGE = -4,  // 欠压保护
    MODE_ERROR_OVER_CURRENT = -5,        // 过流保护
    MODE_ERROR_OVER_SPEED = -6,          // 过速保护(TODO)
    MODE_ERROR_OVER_TEMPERATURE = -7,    // 过热保护(TODO)
    MODE_ERROR_MT6835 = -8,              // 角度传感器故障
    MODE_ERROR_DRIVER = -9,              // 驱动器保护，通常为MOS管DS压降超标
} foc_modes;

void dump_debug(void);

void FOC_Set_Vref_VM_Voltage(float vref, float vm);
int32_t FOC_Calibration(void);
void FOC_Test_Mode(void);

void FOC_HighFrequencyTask(void);
void FOC_MediumFrequencyTask(void);
void FOC_LowFrequencyTask(void);

extern volatile bool allow_pwm_out;

#endif /* INC_FOC_H_ */
